iT邦幫忙

2025 iThome 鐵人賽

0
Mobile Development

Flutter :30天打造念佛App,跨平台應用從Mobile到VR,讓極樂世界在眼前實現!系列 第 32

[ 番外篇 ] Flutter Meta Horizon Store 上架 實戰應用篇 — 2D Android App 送審流程

  • 分享至 

  • xImage
  •  

2025 iThome 鐵人賽
「 Flutter :30 天打造念佛 App ,跨平台從 Mobile 到 VR ,讓極樂世界在眼前實現 ! 」
番外篇
「 Flutter Meta Horizon Store 上架 實戰應用篇 — 2D Android App 送審流程


前言

前幾天我們已經將 念佛 App 進行 Meta Quest 3 實機測試,
今天我們會先從 Meta 官方文件了解「 2D Android App 上架規範 」 ,
接著依據規範進行「 專案檢查與前置準備 」 ,
最後在 Meta 開發人員面板完成 「 Meta Horizon Store 送審流程 」!

文章目錄
一、上架規範
二、前置準備
三、送審流程


一、上架規範

1. Meta 官方文件

主題 內容摘要
應用政策 App 內購必須走 Meta 平台的 IAP;一般不得投放廣告,除非與 Meta 書面同意。
內容準則 App 內容不得包含色情、過度暴力、仇恨行為等
素材設計 素材格式要求、不得顯示非 Meta Quest 的硬體與平台等
隱私政策 提供隱私權政策 URL,清楚說明如何使用戶資料及刪除資料等
Android Apps Android App 文件總覽頁面
Android 設計要求 Android App UI & UX 設計規範
VRC 檢查 送審前檢查清單,包含打包要求、權限要求、功能要求等

2. Android 設計要求

(1) Navigation 導覽

指引 說明
視需要在介面加入返回按鈕 與 Android 行動裝置不同,系統的返回按鈕並非在所有輸入型態中都可用。若有需要,請在 App 介面中加入返回按鈕。

(2) Inputs and hit targets 輸入與觸控目標

指引 說明
確保觸控目標尺寸足夠 舒適的觸控目標最小應為 48dp × 48dp。一般建議對 App 中所有主要控制項維持最小 60dp × 60dp 的觸控目標,以便支援手部追蹤的可達性。
使用不可見的 hit slop 對於未達觸控目標最小尺寸要求的素材,應實作 hit slop。
在元件之間留出足夠空間 不僅要考量元件本身的尺寸,也要考量元件之間的間距,因為某些小型元件周圍會有不可見的 hit slop 以補足觸控目標尺寸。
為所有目標與輸入加入 hover 狀態 為互動元素加入 hover (被瞄準)與 focus(正與目標互動) 狀態,以支援多種輸入型態。

(3) Color 色彩

指引 說明
提供足夠的色彩對比 前景與背景的對比度,一般文字需達 4.5:1,標題或非文字元素(如按鈕背景)需達 3:1。
在頭顯裝置中測試色彩 頭顯中的顏色通常會比手機或桌機略為飽和。請務必在頭顯上測試並視需要調整配色。
避免使用純白(#FFFFFF)與純黑(#000000) 高對比色在 MR 情境表現不佳。建議以淺灰與深灰取代純白與純黑。若使用淺色背景,建議亮度不高於 #DADADA 以避免眼睛疲勞。

(4) Typography 字體排版

指引 說明
選擇正確的字級(字體大小) 一般 App 建議字級不小於 14px,才能達到閱讀的最低可辨識度;不小於 18px 通常可提供舒適的閱讀體驗。
選擇易讀的字型 為了縮放時仍保持可讀性,建議選用無襯線字體,具備較高的小寫可視高度與較大的字腔。
選擇合適的字重(字體粗細) 較粗字重比細字更易讀;若使用較細字重,請放大字級以確保可讀性。

(5) Icons 圖示

指引 說明
使用簡潔、易辨識的圖示 精簡圖示以提升清晰度與小尺寸下的可讀性。避免使用筆畫纖細、細節複雜的圖示。
提供合適尺寸的圖示 以 24×24 像素格為使用基準,但在 192×192 像素格上繪製圖示。此作法可讓更高解析度的頭顯上依然表現良好。

3. VRC 檢查 ( Virtual Reality Check )

(1) 打包要求

打包要求的實作,我們會在下一章節「 前置準備 」進行。

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Packaging.1 應用程式資訊清單(AndroidManifest.xml) 必須符合發行版(release)的清單規範。
VRC.Quest.Packaging.2 必須使用 APK Signature Scheme v2 為應用程式簽章。
VRC.Quest.Packaging.3 不得宣告/要求 Quest 不支援的 Android 功能。
VRC.Quest.Packaging.4 必須使用 受支援的 SDK 與引擎版本。
VRC.Quest.Packaging.5 APK 檔案須 小於 1 GB。
VRC.Quest.Packaging.6 所有 Quest 應用程式必須以 64 位元執行檔提交。

(2) 功能要求

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Functional.1 App 必須可安裝並正常執行,不得發生崩潰、凍結或長時間無回應。
VRC.Quest.Functional.2 App 在 Horizon OS 要求暫停時必須配合暫停。 +
VRC.Quest.Functional.3 不得讓使用者在任何流程中卡住而無法繼續。
VRC.Quest.Functional.4 不得遺失使用者資料。
VRC.Quest.Functional.5 應用程式必須正確回應頭顯的位置與方向追蹤。
VRC.Quest.Functional.6 標題與商店素材中僅能出現 Meta Quest 的頭顯與控制器。
VRC.Quest.Functional.7 若核心功能需網路連線,未連線時必須明確告知使用者需要連線。 +
VRC.Quest.Functional.12 同一台頭顯多位已授權使用者,App 必須能正確執行且功能完整。
VRC.Quest.Functional.13 支援在地化的 App 必須預設使用者設定的語言;若不支援,需預設為英文。 +
VRC.Quest.Functional.14 能直接於 Passthrough 模式啟動的 App,使用者自 MR Home 進入時應顯示 Passthrough 載入畫面並於 Passthrough 中啟動。 +

(3) 安全要求

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Security.1 App 應在啟動後 10 秒內執行平台授權檢查。 +
VRC.Quest.Security.2 App 必須只請求運作所需的最少權限,且不得包含不支援的權限。

(4) 輸入要求

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Input.1 遊戲內選單應可由手把的選單鍵,或左手 Touch 控制器的選單鍵啟動。 +
VRC.Quest.Input.7 支援手部追蹤的應用,必須正確處理控制器與手部輸入之間的切換。
VRC.Quest.Input.8 支援手部追蹤的應用中,系統手勢為保留動作,不應觸發應用內的其他行為。

(5) 素材要求

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Asset.1 Logo 必須使用透明背景。
VRC.Quest.Asset.2 商店封面圖必須有清晰品牌識別,不得包含多餘文字、標語或橫幅。
VRC.Quest.Asset.3 商店封面圖的上緣與下緣各 20% 區域不得放置文字。
VRC.Quest.Asset.4 Hero 圖需包含清楚品牌或 App 標題並遵守安全區,常見置中呈現。 +
VRC.Quest.Asset.5 螢幕截圖必須真實呈現 App,不得含其他 Logo、文字或圖示。
VRC.Quest.Asset.6 App 描述、截圖與影片不得出現其他 VR 平台的頭顯、控制器或其 Logo。
VRC.Quest.Asset.7 宣傳影片最長不得超過 2 分鐘。
VRC.Quest.Asset.8 圖像素材上的文字建議字體大小不小於 24 pt。 +
VRC.Quest.Asset.9 使用沉浸式影像圖層、左右沉浸式物件與沉浸式 Logo 時,圖像必須為透明背景。

(6) 廣告要求

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Ads.1 App 必須符合所有廣告政策要求。
VRC.Quest.Ads.2 含廣告的 App 必須在產品詳情頁標示「含廣告」。
VRC.Quest.Ads.3 廣告不得為立體(3D)、頭部追蹤或沉浸式形式。
VRC.Quest.Ads.4 影響 App 使用的廣告必須提供明確的關閉方式。
VRC.Quest.Ads.5 影響 App 使用的廣告不得在使用者連續操作後每次都出現。
VRC.Quest.Ads.6 廣告不得影響裝置功能。
VRC.Quest.Ads.7 廣告不得誘導誤觸,例如模仿 Horizon OS 通知、系統功能等。

(7) 隱私政策要求

VRC 說明 MetaHorizonStore(2D)
VRC.Quest.Privacy.1 隱私權政策網址必須連到由 App 團隊維護的隱私權聲明頁。
VRC.Quest.Privacy.2 隱私權政策需清楚說明 App 蒐集的使用者資料項目。
VRC.Quest.Privacy.3 隱私權政策需清楚說明 App 如何使用使用者資料。
VRC.Quest.Privacy.4 隱私權政策需清楚說明使用者如何請求刪除已蒐集或儲存的個人資料。
VRC.Quest.Privacy.5 團隊與 App 必須通過資料保護相關審查。

(8) 內容要求

VRC 說明 MetaHorizonStore(2D)
VRC.Content.1 App 必須符合所有內容審核與使用規範。
VRC.Content.2 App 的中繼資料(名稱、描述等)必須與實際內文相符。
VRC.Content.3 具使用者產生內容(UGC)的 App 必須提供管道,讓使用者回報違反行為準則的內容或行為。
VRC.Content.4 具使用者產生內容(UGC)的 App 應提供讓使用者可立即隱藏不想看到內容的機制。 +

(9) 發布要求

VRC 說明 MetaHorizonStore(2D)
VRC.Publishing.1 App 官網 URL 必須直接連到有效頁面。
VRC.Publishing.2 如有提供,外部支援連結 URL 必須直接連到有效的支援頁面。
VRC.Publishing.3 如有提供,服務條款(TOS)URL 必須直接連到有效的條款頁面。
VRC.Publishing.4 App 名稱必須符合所有內容規範。
VRC.Publishing.5 App 簡短描述必須符合所有內容規範。
VRC.Publishing.6 App 詳細描述必須符合所有內容規範。
VRC.Publishing.7 搜尋關鍵字必須與 App 相關,並符合所有內容規範。
VRC.Publishing.8 在 App 中繼資料使用 Meta 品牌時,必須符合品牌使用規範。

二、前置準備

1. 發行版應用程式資訊清單要求

檢查點 Meta 規範 專案位置
Android SDK 版本 minSdkVersion: 29-32;targetSdkVersion: 32 build.gradle.kts
app 安裝位置 android:installLocation="auto" AndroidManifest
VR 頭部追蹤 android.hardware.vr.headtracking AndroidManifest
App 名稱 名稱需能代表 App,且在平台上唯一。 AndroidManifest
從最近使用清單排除 android:excludeFromRecents="true” AndroidManifest
支援裝置 android:value="quest2|quest3|quest3s" AndroidManifest

(1) android/app/build.gradle.kts

Meta 官方文件:Android minSdk: 29-32 ;Android targetSdk = 32
Google Play 官方文件:Android targetSdk = 35
因為 Meta 和 Google 兩方要求的 targetSdk 不同,所以我們必須準備不同的變體。
備註:變體(build variant)= buildType × productFlavor 的笛卡兒積

如果之前沒有使用 flavorizr 設定 flavors
android/app/build.gradle.kts 新增 productFlavors { create("prodMeta") }

//結果示例,android/app/build.gradle.kts
android {
 
  flavorDimensions("app")
  
  productFlavors {
    create("prodMeta") {
      dimension = "app"
      applicationId = "你的 applicationId "
      targetSdk = 32          // ← Meta Horizon Store
      resValue("string", "app_name", "你的 app 名稱")
    }
    create("prod") {
      dimension = "app"
      applicationId = "你的 applicationId"
      targetSdk = 35       // ← Google Play Store
      resValue("string", "app_name", "你的 app 名稱")
    }
  }
}

如果之前有用 flavorizr 設定 flavors,
android/app/flavorizr.gradle.kts 新增 productFlavors "prodMeta"


//結果示例,android/app/flavorizr.gradle.kts

import com.android.build.gradle.AppExtension

val android = project.extensions.getByType(AppExtension::class.java)

android.apply {
    flavorDimensions("app")

    productFlavors {
        create("dev") {
            dimension = "app"
            applicationId = "com.earth.amitabha.dev"
            resValue(type = "string", name = "app_name", value = "念佛 Dev")
        }
        create("staging") {
            dimension = "app"
            applicationId = "com.earth.amitabha.staging"
            resValue(type = "string", name = "app_name", value = "念佛 Staging")
        }
        create("prod") {
            dimension = "app"
            applicationId = "com.earth.amitabha"
            resValue(type = "string", name = "app_name", value = "念佛")
        }
        create("prodMeta") {
            dimension = "app"
            applicationId = "com.earth.amitabha"
            targetSdk = 32
            resValue(type = "string", name = "app_name", value = "念佛")          
        }   
    }
}

(可選)
android/app/build.gradle.kts 同樣寫上 productFlavors { create("prodMeta") } ,
避免跑 flavorizr 覆蓋 prodMeta 段落直接消失。

//結果示例,android/app/build.gradle.kts

android {
    defaultConfig {
    ...
    }
    
    signingConfigs {
    ...   
    }

    buildTypes {
    ...  
    }
}


apply { from("flavorizr.gradle.kts") }

// 追加在 apply { from("flavorizr.gradle.kts") } 下面

android {
  productFlavors {
    maybeCreate("prodMeta").apply {
      dimension = "app"
      applicationId = "com.earth.amitabha"
      targetSdk = 32
      resValue(type = "string", name = "app_name", value = "念佛")
    }
  }
}

(2) android/app/src/prodMeta/AndroidManifest.xml

Meta 要求的重點宣告,有兩項需要注意:

所以我們將上架 Meta 的相關宣告另外寫 prodMeta/AndroidManifest.xml,
上架 Play 商店則維持使用 main/AndroidManifest.xml , Mobile 端使用者不受影響。

//僅列差異鍵
//Gradle 會合併 main/AndroidManifest.xml、prodMeta/AndroidManifest.xml

<!-- installLocation 代表 app 安裝位置,寫在最外層 manifest 屬性 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="auto"> 
    
<!-- 權限需求,寫在 manifest 子節點 -->
		<uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.INTERNET" />
    
<!-- 頭部追蹤,寫在 manifest 子節點  -->
    <uses-feature
        android:name="android.hardware.vr.headtracking" 
        android:required="true"
        android:version="1" />
        
    <!-- 支援的 Quest 裝置,寫在 application 子節點-->  
    <application android:label="@string/app_name" ...>
        <meta-data 
            android:name="com.oculus.supportedDevices"
            android:value="quest2|quest3|quest3s" /> 
            
				<!-- excludeFromRecents 代表從近期使用清單排除, 寫在 Activity 子節點-->
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:excludeFromRecents="true" 
            ...>
        </activity>
    </application>
</manifest>
  • AndroidManifest .xml 自動合併
    打包時 Android Gradle Plugin 會自動將不同的 AndroidManifest.xml 進行合併。
  • 合併優先順序 (由最低合併至最高):
    library manifest(最低優先順序) ⭢ main manifest ⭢ build variant manifest(最高優先順序)
  • 備註:
    最外層的 manifest 屬性不會被合併,系統只會使用優先順序最高的 AndroidManifest.xml 最外層 manifest 屬性。

2. 檢查權限功能與相依套件

檢查點 Meta 規範 專案位置
不支援的權限功能 禁止的權限需審核的權限 AndroidManifest
不支援的相依套件 不支援的相依套件 pubspec.yaml

備註:
Android Studio IDE 可以使用 Meta Horizon Android Studio 插件 偵測不支援的相依套件與權限

(1) Meta 禁止的權限(摘要)

功能類別 相關權限 Meta Quest 狀態
背景定位 ACCESS_BACKGROUND_LOCATION 禁止
通訊錄 READ_CONTACTS、WRITE_CONTACTS 禁止
電話/簡訊 CALL_PHONE、READ_PHONE_STATE、READ_SMS、SEND_SMS … 禁止

(2) Meta 需審核的權限(摘要)

功能類別 相關權限 Meta Quest 狀態 使用說明 / 備註
藍牙裝置互通 BLUETOOTH_CONNECT / BLUETOOTH_SCAN / BLUETOOTH_ADVERTISE 需審核 僅限為了和「無法透過 Meta Quest 手機 App 配對」的第三方藍牙裝置互通時使用。
相機(一般) CAMERA 需審核 允許的情境包含以 Unity 開發並使用 WebcamTexture 的 App。
相機(頭顯 MR) HEADSET_CAMERA 需審核 允許的情境包含:用於偵測可互動物件等 MR 功能。
Avatar 視訊來源 AVATAR_CAMERA 需審核 允許的情境包含:視訊會議(虛擬分身相機來源)。
外部儲存 READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE 需審核 改用 Scoped Storage
通知 POST_NOTIFICATIONS 需審核 採用 Meta 平台工具不需此權限;  Meta Horizon Developer Dashboard→ Engagement → User Notifications
麥克風/錄音權限 RECORD_AUDIO 需審核 合理用途(如 VoIP 或確實需麥克風功能)可申請
喚醒鎖 WAKE_LOCK 需審核 由 Meta 平台管理
開機啟動 RECEIVE_BOOT_COMPLETED 需審核 僅在有正當理由於開機完成後啟動必要流程時使用,避免濫用常駐。

備註:
HEADSET_CAMERA :
Meta Quest 取得空間真實環境畫面,須透過頭顯的外部相機(HEADSET_CAMERA 權限)
AVATAR_CAMERA :
在會議或通話中輸出 AVATAR 虛擬分身影像作為視訊來源(AVATAR_CAMERA 權限)

(3) Meta 不支援的相依套件

常見的 Google 驗證、登入 、定位等 GMS 都不支援
Android Notifications 要改用 Meta User Notifications

  • 不支援的 Android 相依套件
相依套件 內容 替代方案
Android Notifications Android 通知 user notifications
App orientation / screen sizes App 方向/螢幕尺寸 panel sizing
相依套件 內容 替代方案
Google Authentication / Sign in With Google Google 驗證與登入 AppAuth for Android
Android Notifications Android 通知 push notifications
Google Location Services Google 定位服務 Android LocationManager
Google AdID Google 廣告 ID Ad Attestation and Ad ID
Android Billing Android 計費 Horizon Billing Compatibility SDK
  • 不支援的 Firebase 相依套件

Quest 裝置支援所有不需要 GMS 的 Firebase 相依套件。

相依套件 內容 替代方案
App Check Play Integrity provider Play Integrity 驗證 Platform SDK Entitlement Checking
App Check SafetyNet provider SafetyNet 驗證 Platform SDK Entitlement Checking
App Indexing App 內容索引 Android App Links
Dynamic Links 跨平台深連結 Android App Links
Cloud Messaging FCM 推播 user notifications
Firebase ML Vision 影像辨識 沒有建議方案
Firebase ML Custom Model 自訂 ML 模型託管下發 沒有建議方案

3. 簽章

檢查點 Meta 規範 專案位置
簽章 APK Signature Scheme v2 build.gradle.kts

備註:
Android APK 簽章方案
v1 方案:基於 JAR 簽章,不保護部分 APK 內容(例如 ZIP 數據)
v2 方案:APK 簽章方案 v2 ,Android 7.0 引入,全檔案簽署配置、強化保護 APK 內容。
v3 方案:APK 簽章方案 v3, Android 9.0 引入,支援金鑰輪替。

(1) 建立金鑰與金鑰儲存庫 keystore

//終端機指令

//建立本機 home 目錄資料夾,~展開會是 /Users/<使用者名稱>
mkdir -p ~/.keystores

//建立金鑰寫進keystore
keytool -genkeypair -v -keystore ~/.keystores/release.jks \
  -storetype JKS -alias release -keyalg RSA -keysize 2048 -validity 10000
  
//鎖權限:僅擁有者能讀寫
chmod 600 ~/.keystores/release.jks
//憑證資訊

輸入金鑰儲存庫密碼:  
重新輸入新密碼: 
Enter the distinguished name. Provide a single dot (.) to leave a sub-component empty or press ENTER to use the default value in braces.
您的名字與姓氏為何?
  [Unknown]:  
您的組織單位名稱為何?
  [Unknown]:  
您的組織名稱為何?
  [Unknown]:  
您所在的城市或地區名稱為何?
  [Unknown]:  
您所在的州及省份名稱為何?
  [Unknown]:  
此單位的兩個字母國別代碼為何?
  [Unknown]:  

(2) 建立 gradle.properties

Gradle 是 Android 的建構系統,用途是將原始碼轉換為可執行的應用程式,
gradle.properties 是使用者設定檔,讓 Gradle 打包簽章時可以找到金鑰,也避免金鑰放進版控。

//終端機指令

//建立在本機 home 目錄
nano ~/.gradle/gradle.properties
  • 如果已經在打包 play 商店 aab 時建立 gradle.properties,使用同一份即可。
  • KEY_ALIAS 是 金鑰別名,用於指定 KEYSTORE 特定一把金鑰。
  • 商店上架核對的是簽章憑證指紋 X.509 ( 常用 SHA-256 ),
    所以 KEY_ALIAS 如何命名不會影響,只要記得保持使用同一把金鑰。
#空白 gradle.properties 設定資訊

MY_KEYSTORE=/Users/<使用者名稱>/.keystores/release.jks
MY_KEY_ALIAS=release 
MY_KEYSTORE_PASSWORD=<你的密碼>
MY_KEY_PASSWORD=<你的密碼>
//儲存離開 gradle.properties
存檔方式:Ctrl + O (英文字母O) → Enter
離開方式:Ctrl + X

(3) 綁定簽章 android/app/build.gradle.kts 添加 signingConfigs、buildTypes

// android/app/build.gradle.kts 添加以下內容

signingConfigs {
        create("release") {
            val ks = (project.findProperty("MY_KEYSTORE") ?: System.getenv("MY_KEYSTORE")) as String
            storeFile = file(ks)
            storePassword = (project.findProperty("MY_KEYSTORE_PASSWORD")
                ?: System.getenv("MY_KEYSTORE_PASSWORD")) as String
            keyAlias = (project.findProperty("MY_KEY_ALIAS")
                ?: System.getenv("MY_KEY_ALIAS")) as String
            keyPassword = (project.findProperty("MY_KEY_PASSWORD")
                ?: System.getenv("MY_KEY_PASSWORD")) as String
        }
}

buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
             isMinifyEnabled = false
             isShrinkResources = false
        }
}

4. 打包 APK

APK:可直接安裝到裝置的安裝檔
AAB:商店用的發佈檔,商店會依使用者裝置產出並簽名最佳化的 APK。

檢查點 Meta 規範 專案位置
打包 APK arm64 app-prodmeta-release.apk
//終端機指令:打包 APK
flutter build apk --release --flavor prodMeta --target-platform=android-arm64

//通常輸出路徑:
build/app/outputs/flutter-apk/app-prodmeta-release.apk

5. 驗證簽章

//終端機指令

//確認 apksigner 所在路徑
ls ~/Library/Android/sdk/build-tools/*/apksigner

//結果示例
/Users/***/Library/Android/sdk/build-tools/36.0.0/apksigner
//終端機指令

//驗證簽章

 ~/Library/Android/sdk/build-tools/36.0.0/apksigner \
  verify --verbose --print-certs build/app/outputs/flutter-apk/app-prodmeta-release.apk

6. 檢查檔案大小

檢查點 Meta 規範 專案位置
APK 大小 APK 檔案須小於 1 GB app-prodmeta-release.apk
ls -lh build/app/outputs/flutter-apk/app-prodmeta-release.apk

//結果示例,101MiB(106.2 MB)
101M Oct 26 19:48 build/app/outputs/flutter-apk/app-prodmeta-release.apk

7. Meta Quest 3 實機測試 apk

adb -s <IP>:5555 install -r build/app/outputs/flutter-apk/app-prodmeta-release.apk

三、送審流程

1. 建立應用程式 Meta Horizon 開發者面板

2. 驗證組織

3. 簽署開發商發布協議

4. 提供個人角色與目標

5. 自我驗證應用程式年齡層

6. 配置分享設定

7. 添加隱私政策

8. Meta Quest Developer Hub 上傳 APK

Meta Quest Developer Hub for Mac
Meta Quest Developer Hub for Windows

(1) 發布管道 Release Channel

管道 常見用途 測試者範圍 是否需商店審核
Alpha 內部測試 指定受邀的測試者 不需審核
Beta 公開測試、穩定性驗證 受邀或公開加入的測試者 不需審核
RC(Release Candidate) 發版候選、最終驗收 少量核心測試者與內部團隊 不需審核
Production(Store / LIVE) 正式上架 所有符合條件的商店用戶 需通過審核

(2) 新增用戶至發布管道

項目 公開(Public) 私人(Private)
可見性 已購買 App 的用戶可看見該公開管道並自助加入 僅收到邀請信 / 邀請連結的人可見
年齡限制 至少 13 歲 至少 18 歲
評論限制 只有公開管道的用戶能在商店留評論 私人管道用戶無法留商店評論

9. 建置版本

10. 設定價格

(1) 上架類型 Listing Type

上架類型 說明 適用情境 注意事項
Coming Soon 在商店中建立「即將推出」 頁面,讓用戶可瀏覽/加入願望清單,但尚不能購買。 App 尚未準備好上架,但想開始行銷、累積目標群。 可在上架日前最多 180 天 建立。價格尚未設定為可購,不能進行預處理。
Pre-Order 用戶「預購」App,一旦上架即可下載/啟用。通常在發佈日的前一天扣款。 App 已經接近完成,但還需要一些時間上架,同時想提前鎖定用戶/獲得收入。 預購頁面價格一旦設置就不能更改。可在上架日前最多 90 天 建立。
Full Release 「正式上架版本」,用戶可立即購買與下載。 當 App 已完成並準備向所有用戶公開發布。 Full Release 代表進入審核流程並安排直接上架。

(2) 開發人員收款設定

在 Meta Horizon Store 販售付費 App/內購,團隊需建立單一財務帳戶,
完成公司/個人資訊、稅籍、法定負責人資料與收款銀行設定。
交易發生後,Meta 會依使用者所在地計算並代收銷售稅,並在每月撥款週期匯款(USD);
同時扣除平台分潤 30%(除非另有書面約定)。

11. 設定商店資訊與素材

(1) App 資訊

(2) App 類型

(3) App 規格

(4) App 素材:參閱官方 素材設計 指南

(5) App 內容分級

12. 提交送審

13. 審核通過

備註:
如果遇到上架、技術等問題,可以提交支援申請與官方開發者支援團隊聯繫。


重點回顧

重點 內容
上架規範 Virtual Reality Check
前置準備 build.gradle.kts、AndroidManifest.xml、APK
送審流程 Meta 開發人員面板、Meta Quest Developer Hub

上一篇
[ 番外篇 ] Flutter MetaQuest 3 實戰應用篇 — VR 實機測試,沈浸式的 App 體驗 !
系列文
Flutter :30天打造念佛App,跨平台應用從Mobile到VR,讓極樂世界在眼前實現!32
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言